const CryptoJS = require('crypto-js');
const bcrypt = require('bcryptjs');

const SECRET_KEY = 'wxw{250205}^_^'; // 需与前端一致
const SALT_ROUNDS = 10;

/**
 * 解密前端密码
 * @param {*} password 用户提交的密码
 * @returns 
 */
const decrypt = (password)=>{
    const decryptedBytes = CryptoJS.AES.decrypt(password, SECRET_KEY);
    const originalPassword = decryptedBytes.toString(CryptoJS.enc.Utf8);
    return originalPassword
}

/**
 * 哈希密码(加密入库)
 * @param {*} password 用户提交的密码
 * @returns hashedPassword 加密后密码
 */
exports.hashedPassword =  async (password) => {
    // 1. 解密前端密码
    const originalPassword = decrypt(password)
  
    // 2.哈希加密
    const hashedPassword = await bcrypt.hash(originalPassword, SALT_ROUNDS)
    return hashedPassword 
}
 
/**
 * 验证密码
 * @param {*} password 用户提交的密码
 * @param {*} userPassword 查询数据库中用户的密码
 * @returns isMatch 密码验证结果
 */
exports.isMatch = async (password,userPassword) => {
    // 1. 解密前端密码
    const originalPassword = decrypt(password)
    // console.log(originalPassword);
    // 2. 密码验证    
    const isMatch = await bcrypt.compare(originalPassword, userPassword)
    return isMatch
}

/**
 * 哈希token(加密入库)
 * @param {*} token 用户提交/首次登录生成的token
 * @returns hashedPassword 加密后token
 */
exports.hashedToken =  async (token) => {   
    // 哈希加密
    const hashedToken = await bcrypt.hash(token, SALT_ROUNDS)
    return hashedToken 
}

/**
 * 
 * @param {*} token 用户提交的token 
 * @param {*} userToken 查询数据库中会话用户的token
 * @returns tokenIsMatch token验证结果
 */
exports.tokenIsMatch = async (token,userToken) => {
    // 1. token验证    
    const tokenIsMatch = await bcrypt.compare(token, userToken)
    return tokenIsMatch
}